/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import pojo.Nguoidung;
import pojo.Quyenhan;
import pojo.Tinhtrang;
import util.HibernateUtil;
import util.Utils;

/**
 *
 * @author kydrenw
 */
public class NguoidungDAO {
    
    /**
     * Lấy thông tin người dùng dựa vào tên đăng nhâp.
     * @param tendangnhap: Ten dang nhập của người dùng cần lấy thông tin.
     * @return Đối tượng chứa thông tin người dùng cần lấy.
     */
    public static Nguoidung layThongTin(String tendangnhap) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Nguoidung sp = (Nguoidung) session.get(Nguoidung.class, tendangnhap);
        
        return sp;
    }
    
    /**
     * Lấy danh sách người dùng.
     * @return Danh sách thông tin người dùng tìm thấy.
     */
    public static List<Nguoidung> layDanhSach() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = "FROM Nguoidung";
        Query query = session.createQuery(hql);
        List<Nguoidung> ds = query.list();
        
        return ds;
    }
    
    /**
     * Kiểm tra sự tồn tại của người dùng dựa theo tên và mật khầu.
     * @param tendangnhap: tên đăng nhập cảu người dùng.
     * @param matkhau : Mật khẩu của ngừoi dùng.
     * @return : true nếu thành công, false nếu thất bại.
     */
    public static boolean kiemTraDangNhap(String tendangnhap, String matkhau) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = String.format("FROM Nguoidung WHERE tendangnhap='%s' AND matkhau='%s'", tendangnhap, Utils.maHoa_MD5(matkhau));
        Query query = session.createQuery(hql);
        List<Nguoidung> ds = query.list();
        
        if (ds.size() > 0) {
            return true;
        }

        return false;
    }

    /**
     * Kiểm tra người dùng có trong cơ sở dữ liệu hay không.
     * @param tenDangNhap Tên đăng nhập của người dùng
     * @param matKhau   Mật khẩu người dùng
     * @return : đối tượng Nguoidung nếu thành công.
     *           Null nếu thất bại.
     */
    public static Nguoidung doLogIn(String tenDangNhap, String matKhau) {
        Nguoidung result = null;
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.getCurrentSession();
        Transaction trans = session.getTransaction();
        String hql = "from Nguoidung where tendangnhap=:tendn and matkhau =:mk and tinhtrang.ma != 2";

        try {
            trans.begin();
            Query qr = session.createQuery(hql);
            qr.setParameter("tendn", tenDangNhap);
            qr.setParameter("mk", Utils.maHoa_MD5(matKhau));
            result = (Nguoidung) qr.uniqueResult();
            trans.commit();

        } catch (Exception ex) {
            System.out.print("Log in fail for user " + tenDangNhap);
            result = null;
        }

        return result;
    }

    /**
     * Kiểm tra sự tồn tại của người dùng dựa vào tên đăng nhập.
     * @param tendangnhap : tên đăng nhập cần kiểm tra.
     * @return : true nếu tìm thấy, false nếu khong tìm thấy.
     */
    public static boolean kiemTraNguoiDung(String tendangnhap) {
        Nguoidung _User = NguoidungDAO.layThongTin(tendangnhap);
        if (_User == null) {
            return false;
        }

        return true;
    }

    /**
     * Kiểm tra email đã tồn tại hay chưa.
     * @param mail : địa chỉ email cần kiểm tra.
     * @return true nêu địa chỉ mail đã tồn tại, false nếu chưa.
     */
    public static boolean kiemTraMail(String mail) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = String.format("FROM Nguoidung WHERE email='%s'", mail);
        Query query = session.createQuery(hql);
        List<Nguoidung> ds = query.list();
        
        if (ds.size() > 0) {
            return true;
        }
        return false;
    }

    /**
     * Kiểm tra người dùng có phải là admin hay không dựa vào tên đăng nhập.
     * @param tendangnhap : tên đăng nhập cần kiểm tra thông tin.
     * @return : true nếu là admin, false nếu không phải là admin.
     */   
    public static boolean laAdmin(String tendangnhap) {
        Nguoidung user = new Nguoidung();
        user = NguoidungDAO.layThongTin(tendangnhap);

        Set listQh = new HashSet();
        listQh = user.getQuyenhans();

        Object[] listPq = (Object[]) listQh.toArray();

        for (int i = 0; i < listPq.length; i++) {
            Quyenhan qh = new Quyenhan();
            qh = (Quyenhan) listPq[i];
            if (qh.getMa() == 1) {
                return true;
            }
        }
        return false;
    }

    /**
     * Kiểm tra người dùng có phải là quản lý hay không dựa vào tên đăng nhập.
     * @param tendangnhap : tên đăng nhập cần kiểm tra thông tin.
     * @return : true nếu là quản lý, false nếu không phải là quản lý.
     */ 
    public static boolean laQuanLy(String tendangnhap) {
        Nguoidung user = new Nguoidung();
        user = NguoidungDAO.layThongTin(tendangnhap);

        Set listQh = new HashSet();
        listQh = user.getQuyenhans();

        Object[] listPq = (Object[]) listQh.toArray();

        for (int i = 0; i < listPq.length; i++) {
            Quyenhan qh = new Quyenhan();
            qh = (Quyenhan) listPq[i];
            if (qh.getMa() == 2) {
                return true;
            }
        }
        return false;
    }

    /**
     * Kiểm tra người dùng có phải là khách hàng hay không dựa vào tên đăng nhập.
     * @param tendangnhap : tên đăng nhập cần kiểm tra thông tin.
     * @return : true nếu là khách hàng, false nếu không phải là khách hàng.
     */
    public static boolean laKhachHang(String tendangnhap) {
        Nguoidung user = new Nguoidung();
        user = NguoidungDAO.layThongTin(tendangnhap);

        Set listQh = new HashSet();
        listQh = user.getQuyenhans();

        Object[] listPq = (Object[]) listQh.toArray();

        for (int i = 0; i < listPq.length; i++) {
            Quyenhan qh = new Quyenhan();
            qh = (Quyenhan) listPq[i];
            if (qh.getMa() == 3) {
                return true;
            }
        }
        return false;
    }

    /**
     * Thêm người dùng mới vào CSDL.
     * @param nguoiDung: Đối tượng chứa thông tin người dùng cần thêm vào.
     * @return : true nếu thành công, false nếu thất bại.
     */
    public static boolean themNguoiDung(Nguoidung nguoiDung) {
        Boolean result = true;
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session session = sf.getCurrentSession();
        Transaction trans = session.getTransaction();

        try {
            trans.begin();
            
            // Hash mật khẩu người dùng trước khi lưu vào CSDL
            nguoiDung.setMatkhau(Utils.maHoa_MD5(nguoiDung.getMatkhau()));
            session.save(nguoiDung);
            trans.commit();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            result = false;
        }
        return result;
    }

    /**
     * Đánh dấu xóa người dùng trong CSDL.
     * @param tendangnhap: tên đăng nhập của người dùng cần xóa.
     * @return : true nếu thành công, false nếu thất bại.
     */
    public static boolean xoaNguoidung(String tendangnhap) {
        Nguoidung user = NguoidungDAO.layThongTin(tendangnhap);
        if (user == null) {
            return false;
        }
        //2 : đã xóa
        int matt = 2;
        Tinhtrang tt = TinhtrangDAO.layThongTin(matt);
        user.setTinhtrang(tt);
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            session.beginTransaction();
            session.saveOrUpdate(user);
            session.flush();
            session.getTransaction().commit();
            return true;
        } catch (Exception e) {
            session.getTransaction().rollback();
            System.out.println(e);
            return false;
        } finally {
            
        }
    }

    /**
     * Cập nhật lại thông tin của người dùng.
     * @param user Đối tượng người dùng cần cập nhật thông tin.
     * @return true nếu cập nhật thành công, false nếu cập nhật thất bại.
     */
    public static boolean suaNguoiDung(Nguoidung user) {
        if (NguoidungDAO.layThongTin(user.getTendangnhap()) == null) {
            return false;
        }
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.close();
        session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.update(user);
            session.getTransaction().commit();
            return true;
        } catch (Exception e) {
            session.getTransaction().rollback();
            System.out.println(e);
            return false;
        } finally {
            
        }
    }
    
    /**
     * Reset lại mật khẩu cua người dùng. (Dùng lúc gửi lại mật khẩu qua email).
     * @param email Email của người dùng cần reset mật khẩu.
     * @param matKhau Mật khẩu mới được reset
     * @return true nếu thành công, false nếu thất bại.
     */
    public static boolean suaMatKhau(String email, String matKhau){
        Boolean result = false;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();
        String hql = "Update Nguoidung nd set nd.matkhau =:Matkhau where nd.email =:Email";
        
        try{
            trans.begin();
            Query qr = session.createQuery(hql);
            
            //set đối số mạt khẩu va email cho câu truy vấn.
            qr.setString("Matkhau", Utils.maHoa_MD5(matKhau));
            qr.setString("Email", email);
            
            if(qr.executeUpdate() > 0){
                result = true;
            } else{
                result = false;
            }
            trans.commit();
        } catch (Exception ex){
            System.out.println(ex.getMessage());
            result = false;
        }
        
        return result;
    }
    
    /**
     * Cập nhật lại mật khẩu cho người dùng.
     * @param tendangnhap : tên đăng nhập của người dùng cần đổi mật khầu.
     * @param matKhau : mật khẩu mới.
     * @return : true nếu tành công, false nếu thất bại.
     */
    public static boolean suaMatKhautdn(String tendangnhap, String matKhau){
        Boolean result = false;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction trans = session.getTransaction();
        String hql = "Update Nguoidung nd set nd.matkhau =:Matkhau where nd.tendangnhap =:Tendangnhap";
        
        try{
            trans.begin();
            Query qr = session.createQuery(hql);
            qr.setString("Matkhau", Utils.maHoa_MD5(matKhau));
            qr.setString("Tendangnhap", tendangnhap);
            
            if(qr.executeUpdate() > 0){
                result = true;
            } else{
                result = false;
            }
            trans.commit();
        } catch (Exception ex){
            System.out.println(ex.getMessage());
            result = false;
        }
        
        return result;
    }

    /**
     * Tìm kiếm người dùng dựa theo thông tin đưa vào.
     * @param tukhoa : từ khóa để tìm kiếm.
     * @param muc : mục cần tìm.
     * @return : thông tin người dùng, nếu thất bại --> null.
     */
    public static List<Nguoidung> timKiem(String tukhoa, int muc) {
        String hql = null;
        if (tukhoa == null || "".equals(tukhoa) || muc == 0) {
            hql = "FROM Nguoidung";
        } else if (muc == 1) {
            hql = "from Nguoidung where tendangnhap like '%" + tukhoa + "%'";
        } else if (muc == 2) {
            hql = "from Nguoidung where hoten like '%" + tukhoa + "%'";
        } else if (muc == 3) {
            hql = "from Nguoidung where sodienthoai like '%" + tukhoa + "%'";
        } else if (muc == 4) {
            hql = "from Nguoidung where diachi like '%" + tukhoa + "%'";
        } else if (muc == 5) {
            hql = "from Nguoidung where email like '%" + tukhoa + "%'";
        }
        List<Nguoidung> ds = null;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Query query = session.createQuery(hql);
        ds = query.list();
        
        return ds;
    }

    /**
     * Lấy danh sách người dùng theo tình trạng. (xóa, chưa xóa, banned)
     * @param matt: mã tình trạng
     * @return : danh sách người dùng nếu thành công, null nếu thất bại.
     */
    public static List<Nguoidung> layDanhSach(int matt) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String hql = "FROM Nguoidung where matt=" + matt;
        Query query = session.createQuery(hql);
        List<Nguoidung> ds = query.list();
        
        return ds;
    }
}
